package cn.study.forkjointest.recursiveaction;


import cn.study.forkjointest.util.Utils;

import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;
/**
 * @Author     ：跟大佳一起学架构
 * @Description： 2000W数据排序对比
 */
public class ArrayToSortMain {

    /**
     * 单线程-归并排序
     */
    public static void main(String[] args) {
        //生成测试数组  用于归并排序
        int[] arrayToSortByMergeSort = Utils.buildRandomIntArray(20_000_000);
        //生成测试数组  用于forkjoin排序 并行
        int[] arrayToSortByForkJoin = Arrays.copyOf(arrayToSortByMergeSort, arrayToSortByMergeSort.length);
        //生成测试数组  用于快速排序
        int[] arrayToSortByQuick = Arrays.copyOf(arrayToSortByMergeSort, arrayToSortByMergeSort.length);

        long startTime = System.nanoTime();
//        /**
//         *  快速排序
//         */
//        QuickSort.quickSort(arrayToSortByQuick,0,arrayToSortByQuick.length-1);
        long duration = System.nanoTime()-startTime;
//        System.out.println("单线程快速排序时间: "+(duration/(1000f*1000f))+"毫秒");
//
//
//        //
//        /**
//         *  归并排序
//         */
//        MergeSort mergeSort = new MergeSort(arrayToSortByMergeSort, 200);
//        startTime = System.nanoTime();
//        mergeSort.mergeSort();
        duration = System.nanoTime()-startTime;
//        System.out.println("单线程归并排序时间: "+(duration/(1000f*1000f))+"毫秒");

        /**
         * 并行归并排序（forkjoin）
         */
        //利用forkjoin排序  第一步构建一个任务
        MergeSortTask mergeSortTask = new MergeSortTask(arrayToSortByForkJoin, 20000);
        //获取处理器数量
        int processors = Runtime.getRuntime().availableProcessors();
        // 第二步：构建forkjoin线程池 (看构造器参数)
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        startTime = System.nanoTime();
        //第三步：提交我们任务，执行排序任务 （线程池有的方法他也有）
        forkJoinPool.invoke(mergeSortTask);
        duration = System.nanoTime()-startTime;
        System.out.println("forkjoin排序时间: "+(duration/(1000f*1000f))+"毫秒");

    }
}
